package usuarios;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import alugaveis.Aluguel;
import exceptions.CPFInvalidoException;
import exceptions.EmailInvalidoException;
import exceptions.ListaEnderecoInvalidaException;
import exceptions.NomeInvalidoException;
import exceptions.SenhaInvalidaException;
import exceptions.TelefoneInvalidoException;
import exceptions.UsernameInvalidoException;

public class Cliente extends Pessoa {
	
	private static final long serialVersionUID = 1L;
	
	private List<Aluguel> alugueis;
	private Date dataAssociacao;
	private Date dataAniversario;
	private int pontosFidelidade;

	/**
	 * Construtor de um Cliente.
	 * 
	 * @param nome
	 *            O nome da Pessoa. Nao pode ser null e deve ser uma String com
	 *            no minimo um espaco entre duas cadeias de letras.
	 * @param cpf
	 *            O CPF da Pessoa. Nao pode ser nulo e deve conter 11 digitos ou
	 *            11 digitos separados, inicialmente, 3 a 3 por pontos e os
	 *            ultimos dois digitos antecedidos por um hifen.
	 * @param telefone
	 *            O telefone da Pessoa. O telefone nao pode ser nulo e deve ser
	 *            formado por 8 digitos ou 8 digitos separados 4 a 4 por um
	 *            hifen.
	 * @param email
	 *            O email da Pessoa. O email nao pode ser nulo e deve ter,
	 *            inicialmente, um arroba entre cadeias de caracteres seguidos
	 *            de um ponto e um final de dois ou tres caracteres.
	 * @param enderecos
	 *            A lista de enderecos da Pessoa, o primeiro endereco deve ser o
	 *            principal. Apenas o endereco principal eh obrigatorio para toda
	 *            pessoa.
	 * @param username
	 *            O username da Pessoa. Um username valido possui no minimo 6
	 *            caracteres.
	 * @param senha
	 *            A senha da Pessoa. Uma senha valida possui no minimo 6
	 *            caracteres e nao pode ser igual ao username.
	 * @throws NomeInvalidoException
	 *             Se o nome for null ou nao for uma String com no minimo um
	 *             espaco entre duas cadeias de letras.
	 * @throws CPFInvalidoException
	 *             Se o CPF for nulo ou nao conter 11 digitos ou 11 digitos
	 *             separados, inicialmente, 3 a 3 por pontos e os dois ultimos
	 *             digitos antecedidos por um hifen.
	 * @throws TelefoneInvalidoException
	 *             Se o telefone for nulo ou nao conter 8 digitos ou 8 digitos 4
	 *             a 4 separados por um hifen.
	 * @throws EmailInvalidoException
	 *             Se o email for nulo ou nao ter, inicialmente, um arroba entre
	 *             cadeias de caracteres seguidos de um ponto e um final de dois
	 *             ou tres caracteres.
	 * @throws ListaEnderecoInvalidaException
	 *             Se a lista de enderecos for nula ou nao conter um endereco
	 *             principal na primeira posicao.
	 * @throws UsernameInvalidoException
	 *             Se o username for nulo ou nao conter o minimo de 6
	 *             caracteres.
	 * @throws SenhaInvalidaException
	 *             Se a senha for nula ou igual ao username ou nao conter o
	 *             minimo de 6 caracteres.
	 */
	
	public Cliente(String nome, String cpf, String telefone, String email,
			List<Endereco> enderecos, String username, String senha)
			throws NomeInvalidoException, CPFInvalidoException,
			TelefoneInvalidoException, EmailInvalidoException,
			SenhaInvalidaException, UsernameInvalidoException,
			ListaEnderecoInvalidaException {
		
		super(nome, cpf, telefone, email, enderecos, username, senha);	
		this.pontosFidelidade = 0;
		this.alugueis = new ArrayList<Aluguel>();
	
	}

	/**
	 * Recupera a lista de alugueis do cliente.
	 * 
	 * @return A lista de alugueis.
	 */
	
	public List<Aluguel> getAlugueis() {
		return alugueis;
	}

	/**
	 * Recupera a data de associacao do cliente.
	 * 
	 * @return A data de associacao do cliente.
	 */
	
	public Date getDataAssociacao() {
		return dataAssociacao;
	}

	/**
	 * Recupera a data de aniversario do cliente.
	 * 
	 * @return A data de aniversario do cliente.
	 */
	
	public Date getDataAniversario() {
		return dataAniversario;
	}

	/**
	 * Edita a data de aniversario do cliente.
	 * 
	 * @param dataAniversario
	 *            A nova data de aniversario do cliente.
	 */

	public void setDataAniversario(Date dataAniversario) {
		this.dataAniversario = dataAniversario;
	}

	/**
	 * Recupera os pontos de fidelidade do cliente.
	 * 
	 * @return Os pontos de fidelidade do cliente.
	 */

	public int getPontosFidelidade() {
		return pontosFidelidade;
	}

	/**
	 * Edita os pontos de fidelidade do cliente.
	 * 
	 * @param pontosFidelidade
	 *            Novo valor de pontos de fidelidade para o cliente.
	 */

	public void setPontosFidelidade(int pontosFidelidade) {
		this.pontosFidelidade = pontosFidelidade;
	}
}